package com.logic.modular.game.battle.process.skillEffectHandle.skillEffectSelect;

import cn.hutool.extra.spring.SpringUtil;
import com.comment.exception.ServiceException;
import com.logic.modular.game.battle.process.skillEffectHandle.base.SkillEffectStrategy;
import com.logic.modular.game.battle.panel.skillEffect.PvpSkillEffect;

import com.logic.modular.game.battle.process.skillEffectHandle.impl.*;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;


/**
 * 技能效果处理器
 */
@Slf4j
public enum SkillEffectTriggerHandle {
    /////////////////////////////////////////////////////////////////////////////////////////////////////////// 1属性类型
    // 1	攻击属性提高	值或者百分比	att
    attribute_1L(1L, SpringUtil.getBean(AttributeStrategy.class)),
    // 2	防御属性提高	值或者百分比	def
    attribute_2L(2L, SpringUtil.getBean(AttributeStrategy.class)),
    // 3	策略属性提高	值或者百分比	magic
    attribute_3L(3L, SpringUtil.getBean(AttributeStrategy.class)),
    // 4	先攻属性提高	值或者百分比	speed
    attribute_4L(4L, SpringUtil.getBean(AttributeStrategy.class)),
    // 5	统率属性提高	值或者百分比	des
    attribute_5L(5L, SpringUtil.getBean(AttributeStrategy.class)),
    // 6	攻击属性降低	值或者百分比	att
    attribute_6L(6L, SpringUtil.getBean(AttributeStrategy.class)),
    // 7	防御属性降低	值或者百分比	def
    attribute_7L(7L, SpringUtil.getBean(AttributeStrategy.class)),
    // 8	策略属性降低	值或者百分比	magic
    attribute_8L(8L, SpringUtil.getBean(AttributeStrategy.class)),
    // 9	先攻属性降低	值或者百分比	speed
    attribute_9L(9L, SpringUtil.getBean(AttributeStrategy.class)),
    // 10	统率属性降低	值或者百分比	des
    attribute_10L(10L, SpringUtil.getBean(AttributeStrategy.class)),
    // 11	造成所有伤害提升	百分比	all1
    attribute_11L(11L, SpringUtil.getBean(AttributeStrategy.class)),
    // 12	造成物理伤害提升	百分比	physics1
    attribute_12L(12L, SpringUtil.getBean(AttributeStrategy.class)),
    // 13	造成策略伤害提升	百分比	strategy1
    attribute_13L(13L, SpringUtil.getBean(AttributeStrategy.class)),
    // 14	受到所有伤害提升	百分比	all0
    attribute_14L(14L, SpringUtil.getBean(AttributeStrategy.class)),
    // 15	受到物理伤害提升	百分比	physics0
    attribute_15L(15L, SpringUtil.getBean(AttributeStrategy.class)),
    // 16	受到策略伤害提升	百分比	strategy0
    attribute_16L(16L, SpringUtil.getBean(AttributeStrategy.class)),
    // 17	受到所有伤害降低	百分比	all0
    attribute_17L(17L, SpringUtil.getBean(AttributeStrategy.class)),
    // 18	受到物理伤害降低	百分比	physics0
    attribute_18L(18L, SpringUtil.getBean(AttributeStrategy.class)),
    // 19	受到策略伤害降低	百分比	strategy0
    attribute_19L(19L, SpringUtil.getBean(AttributeStrategy.class)),
    // 20	造成所有伤害降低	百分比	all1
    attribute_20L(20L, SpringUtil.getBean(AttributeStrategy.class)),
    // 21	造成物理伤害降低	百分比	physics1
    attribute_21L(21L, SpringUtil.getBean(AttributeStrategy.class)),
    // 22	造成策略伤害降低	百分比	strategy1
    attribute_22L(22L, SpringUtil.getBean(AttributeStrategy.class)),
    // 48	无视所有防御效果	百分比	igDefensiveDefense
    attribute_48L(48L, SpringUtil.getBean(AttributeStrategy.class)),
    // 49	无视物理防御效果	百分比	igPhysicalDefense
    attribute_49L(49L, SpringUtil.getBean(AttributeStrategy.class)),
    // 50	无视策略防御效果	百分比	igStrategicDefense
    attribute_50L(50L, SpringUtil.getBean(AttributeStrategy.class)),
    // 55	受到普通攻击伤害降低	百分比	attack0
    attribute_55L(55L, SpringUtil.getBean(AttributeStrategy.class)),
    // 56	受到主动战法伤害降低	百分比	activeIncrease0
    attribute_56L(56L, SpringUtil.getBean(AttributeStrategy.class)),
    // 57	造成普通攻击伤害提升	百分比	attack1
    attribute_57L(57L, SpringUtil.getBean(AttributeStrategy.class)),
    // 58	造成主动战法伤害提升	百分比	activeIncrease1
    attribute_58L(58L, SpringUtil.getBean(AttributeStrategy.class)),
    // 59	造成普通攻击伤害降低	百分比	attack1
    attribute_59L(59L, SpringUtil.getBean(AttributeStrategy.class)),
    // 60	造成主动战法伤害降低	百分比	activeIncrease1
    attribute_60L(60L, SpringUtil.getBean(AttributeStrategy.class)),
    // 61	受到普通攻击伤害提升	百分比	attack0
    attribute_61L(61L, SpringUtil.getBean(AttributeStrategy.class)),
    // 62	受到主动战法伤害提升	百分比	activeIncrease0
    attribute_62L(62L, SpringUtil.getBean(AttributeStrategy.class)),
    // ////////////////////////////////////////////////////////////////////////////////////////////////////////  0 血量类
    // 32	一次性恢复兵力
    RECOVERY_FORCE(32L, SpringUtil.getBean(BloodVolumeStrategy.RecoverStrategy.class)),
    // 51	发动一次物理攻击
    BloodVolume_51L(51L, SpringUtil.getBean(BloodVolumeStrategy.BloodVolume51.class)),
    // 52	发动一次策略攻击
    STRATEGY_ATTACK(52L, SpringUtil.getBean(BloodVolumeStrategy.StrategyStrategy.class)),
    // //////////////////////////////////////////////////////////////////////////////////////////////////////   20:dot类
    // 28	溃逃	dot伤害，每回合受到一次物理伤害,   损失一部分兵力	currentForce
    dot_28(28L, SpringUtil.getBean(DotStrategy.Dot28.class)),
    // 29	燃烧	dot伤害，每回合受到一次策略伤害，损失一部分兵力	currentForce
    dot_29(29L, SpringUtil.getBean(DotStrategy.Dot29.class)),
    // 30	妖术	dot伤害，每回合受到一次策略伤害，损失一部分兵力	currentForce
    dot_30(30L, SpringUtil.getBean(DotStrategy.Dot30.class)),
    // 31	恐慌	dot伤害，每回合受到一次策略伤害，损失一部分兵力	currentForce
    dot_31(31L, SpringUtil.getBean(DotStrategy.Dot31.class)),
    // ////////////////////////////////////////////////////////////////////////////////////////////////////// 21:控制状态
    // 23	混乱	无法行动（控制状态）	21
    control_23(23L, SpringUtil.getBean(ControlStrategy.Control_23.class)),
    // 24	缴械	无法普通攻击（控制状态）	21
    control_24(24L, SpringUtil.getBean(ControlStrategy.Control_24.class)),
    // 25	技穷	无法主动战法（控制状态）	21
    control_25(25L, SpringUtil.getBean(ControlStrategy.Control_25.class)),
    // 26	暴走	无法正确攻击目标(改成敌我全体)	21
    control_26(26L, SpringUtil.getBean(ControlStrategy.Control_26.class)),
    // 54	嘲讽	无法正确普通攻击目标(改为嘲讽自己的对象)	21
    control_54(54L, SpringUtil.getBean(ControlStrategy.Control_54.class)),
    // //////////////////////////////////////////////////////////////////////////////////////////////////////////// 状态类
    // 33	持续性恢复	休整状态，每回合恢复兵力，行动时恢复	currentForce			11
    status_33(33L, SpringUtil.getBean(StatusStrategy.Status33.class)),
    // 35	绝粮	无法恢复兵力	currentForce	[32,33]		11
    status_35(35L, SpringUtil.getBean(StatusStrategy.Status35.class)),
    // 36	先手	判断顺序   先手状态 > 速度				11
    status_36(36L, SpringUtil.getBean(StatusStrategy.Status36.class)),
    // 37	连击	普通攻击之后，会再次发动一次普通攻击				11
    status_37(37L, SpringUtil.getBean(StatusStrategy.Status37.class)),
    // 38	洞察	免疫（混乱，缴械，技穷，暴走，挑衅）		[23,24,25,26,54]		11
    status_38(38L, SpringUtil.getBean(StatusStrategy.Status38.class)),
    // 39	规避	免疫伤害，一般以次为单位		[51,52]		11
    status_39(39L, SpringUtil.getBean(StatusStrategy.Status39.class)),
    // 41	倒戈	物理吸血(<= 最大兵力)，例如10%的倒戈，如果对对方造成200兵力的物理伤害，则会恢复20兵力				11
    status_41(41L, SpringUtil.getBean(StatusStrategy.Status41.class)),
    // 42	攻心	策略吸血等同 42				11
    status_42(42L, SpringUtil.getBean(StatusStrategy.Status42.class)),
    // 40	无视规避	无视规避，对方有规避状态的时候，仍然可以对对方造成伤害，对方的规避状态不会消失				11
    status_40(40L, SpringUtil.getBean(StatusStrategy.Status40.class)),
    // 43	无视兵种相克	兵种被克的时候，不会受到减伤效果				11
    status_43(43L, SpringUtil.getBean(StatusStrategy.Status43.class)),
    // 44	反击	受到普通攻击时，会进行反击（对攻击你的武将造成物理伤害）				11
    status_44(44L, SpringUtil.getBean(StatusStrategy.Status44.class)),
    // 45	分兵	进入分兵之后，普通攻击时，会对目标武将旁边的武将造成伤害，如果目标是中间武将，则会对两边的两个武将都造成伤害		11
    status_45(45L, SpringUtil.getBean(StatusStrategy.Status45.class)),
    // 46	援护	施法者承担伤害				11
    status_46(46L, SpringUtil.getBean(StatusStrategy.Status46.class)),
    // //////////////////////////////////////////////////////////////////////////////////////////////////////// 10:效果类
    // // 47	净化	移除有害效果，包括控制技能（混乱，缴械，技穷，暴走，挑衅）dot伤害（溃逃，燃烧，妖术，恐慌）
    effect_47(47L, SpringUtil.getBean(EffectCategory.Effect_47.class)),
    // // 63	跳过1回合准备	部分主动战法需要准备回合，这个可以跳过1回合的准备
    effect_63(63L, SpringUtil.getBean(EffectCategory.Effect_63.class)),
    ;
    private final Long type;
    private final SkillEffectStrategy strategy;


    SkillEffectTriggerHandle(Long type, SkillEffectStrategy strategy) {
        this.type = type;
        this.strategy = strategy;
    }

    public static SkillEffectTriggerHandle getByType(Long type) {
        for (SkillEffectTriggerHandle skillEffectStrategyEnum : values()) {
            if (Objects.equals(skillEffectStrategyEnum.type, type)) {
                return skillEffectStrategyEnum;
            }
        }
        throw new ServiceException("无效的效果类型: " + type);
    }

    /**
     * 2 技能效果触发器
     * @param newSkillEffectList (单个)新技能-技能效果列表
     */
    public static List<PvpSkillEffect> applyNewSkillEffect(List<PvpSkillEffect> newSkillEffectList) {
        return newSkillEffectList.stream().map(item -> getByType(item.getCoreSkillEffectTypeId()).strategy.applyEffect(
                item
        )).collect(Collectors.toList());
    }
}
